package com.hy;

import java.util.LinkedList;

/**
 * Created With IntelliJ IDEA.
 * Descriptions:累加数
 *
 * 累加数 是一个字符串，组成它的数字可以形成累加序列。
 * 一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外，序列中的每个后续数字必须是它之前两个数字之和。
 * 给你一个只包含数字 '0'-'9' 的字符串，编写一个算法来判断给定输入是否是 累加数 。如果是，返回 true ；否则，返回 false 。
 * 说明：累加序列里的数，除数字 0 之外，不会 以 0 开头，所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
 *
 * author: Mr.Du
 * Date: 2023/10/19
 * Time: 17:02
 */
public class IsAdditiveNumber {

    LinkedList<Long> list = new LinkedList<>();
    public boolean isAdditiveNumber(String num) {
        if(dfs(num, 0)) return true;
        return false;
    }

    /**
     * 和斐波那契序列做法一样，就是剪枝不一样
     * @param num
     * @param start
     * @return
     */
    public boolean dfs(String num, int start){
        if(start == num.length()){
            return list.size() > 2;
        }
        for(int i = start;i < num.length();i++){
            if(num.charAt(start) == '0' && i > start) break;
            String s = num.substring(start, i + 1);
            int len = list.size();
            if(s.length() > num.length() / 2) continue;
            long cur = Long.valueOf(s);
            if(len >= 2){
                if(cur > list.get(len - 1) + list.get(len -2)){
                    break;
                }
                if(cur < list.get(len - 1) + list.get(len -2)){
                    continue;
                }

            }
            list.add(cur);
            if(dfs(num, i + 1)) return true;
            list.removeLast();

        }
        return false;
    }
}
